package com.feri.fc.order.sign;

import cn.hutool.crypto.SecureUtil;

import java.lang.reflect.Field;
import java.util.Base64;
import java.util.TreeMap;

/**
 * 指尖造梦，精益求精！
 *
 * @Author：Feri
 * @Date：2024/12/2 16:18
 * @Modified：
 */
public class SignUtil {
    /**
     * 下单 参数的签名
     * 签名规则：
     * 1、接口的参数 根据参数名进行字典顺序排序
     * 2、再按照参数名=参数值& 进行参数的拼接，其中sign参数不参与
     * 3、在上述字符串追加当前操作的uid
     * 4、再采用SHA1算法对上述字符串进行摘要生成，并对结果转换为大写
     * 5、进行base64编码，生成最终签名的结果
     * */
    public static String createSign(TreeMap<String,Object> param,Integer id){
        StringBuilder builder=new StringBuilder();
        param.keySet().forEach(k->{
            if(!k.equals("sign")){
                builder.append(k+"="+param.get(k)+"&");
            }
        });
        builder.append(id);
        return Base64.getEncoder().encodeToString(SecureUtil.sha1(builder.toString())
                .toUpperCase().getBytes());

    }
    public static <T> TreeMap<String,Object> parseMap(Class<T> clz,T obj){
        TreeMap<String,Object> map=new TreeMap<>();
        //获取类中的属性
        Field[] fields=clz.getDeclaredFields();
        for (Field f:fields) {
            try {
                if(f.getName().equals("sign")){
                    continue;
                }
                //忽略 访问修饰符 校验
                f.setAccessible(false);
                map.put(f.getName(),f.get(obj));
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }
        return map;
    }
}
